package org.deng.learn.concurrent.basic;

import java.util.Timer;
import java.util.TimerTask;

/**
 * Created By DengLibin
 * Date: 19-4-5
 * Time: 下午5:17
 * Desc: Timer类：
 * 一种工具，线程用其安排以后在后台线程中执行的任务。可安排任务执行一次，或者定期重复执行。
 *
 * 与每个 Timer 对象相对应的是单个后台线程，用于顺序地执行所有计时器任务。计时器任务应该迅速完成。如果完成某个计时器任务的时间太长，那么它会“独占”计时器的任务执行线程。因此，这就可能延迟后续任务的执行，而这些任务就可能“堆在一起”，并且在上述不友好的任务最终完成时才能够被快速连续地执行。
 *
 * 对 Timer 对象最后的引用完成后，并且 所有未处理的任务都已执行完成后，计时器的任务执行线程会正常终止（并且成为垃圾回收的对象）。但是这可能要很长时间后才发生。默认情况下，任务执行线程并不作为守护线程 来运行，所以它能够阻止应用程序终止。如果调用者想要快速终止计时器的任务执行线程，那么调用者应该调用计时器的 cancel 方法。
 *
 * 如果意外终止了计时器的任务执行线程，例如调用了它的 stop 方法，那么所有以后对该计时器安排任务的尝试都将导致 IllegalStateException，就好像调用了计时器的 cancel 方法一样。
 *
 * 此类是线程安全的：多个线程可以共享单个 Timer 对象而无需进行外部同步。
 *
 * 此类不 提供实时保证：它使用 Object.wait(long) 方法来安排任务。
 *
 * 实现注意事项：此类可扩展到大量同时安排的任务（存在数千个都没有问题）。在内部，它使用二进制堆来表示其任务队列，所以安排任务的开销是 O(log n)，其中 n 是同时安排的任务数。
 * 实现注意事项：所有构造方法都启动计时器线程。
 *
 *  void	cancel()
 *           终止此计时器，丢弃所有当前已安排的任务。
 *  int	purge()
 *           从此计时器的任务队列中移除所有已取消的任务。
 *  void	schedule(TimerTask task, Date time)
 *           安排在指定的时间执行指定的任务。
 *  void	schedule(TimerTask task, Date firstTime, long period)
 *           安排指定的任务在指定的时间开始进行重复的固定延迟执行。
 *  void	schedule(TimerTask task, long delay)
 *           安排在指定延迟后执行指定的任务。
 *  void	schedule(TimerTask task, long delay, long period)
 *           安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。
 *  void	scheduleAtFixedRate(TimerTask task, Date firstTime, long period)
 *           安排指定的任务在指定的时间开始进行重复的固定速率执行。
 *  void	scheduleAtFixedRate(TimerTask task, long delay, long period)
 *           安排指定的任务在指定的延迟后开始进行重复的固定速率执行。
 */
public class TimerTaskDemo {
    public static void main(String[] args) {
       // timer1();
       // timer2();
        timer3();
    }
    // 第一种方法：延迟执行
    public static void timer1() {
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            public void run() {
                System.out.println("-------设定要指定任务--------");
            }
        }, 2000);// 设定指定的时间time,此处为2000毫秒
    }
    // 第二种方法： 安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。
    // schedule(TimerTask task, long delay, long period)
    public static void timer2() {
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            public void run() {
                System.out.println("-------设定要指定任务--------");
            }
        }, 1000, 5000);
    }
    // 第三种方法：安排指定的任务在指定的延迟后开始进行重复的固定速率执行。
    // scheduleAtFixedRate(TimerTask task, long delay, long period)
    public static void timer3() {
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new TimerTask() {
            public void run() {
                System.out.println("-------设定要指定任务--------");
            }
        }, 1000, 2000);
    }
}
